package com.seek.core;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.seek.model.dto.PageBean;

public interface BaseService<T extends Serializable> {

	/**
	 * 根据ID得到某个实体
	 */
	public T findById(Serializable id);

	/**
	 * 根据ID得到某个实体
	 */
	public T load(Serializable id);

	/**
	 * 返回某种实体的集合
	 */
	public List<T> findAll();
	
	/**
	 * 添加实体
	 */
	public T  save(T entity) throws Exception;

	/**
	 * 更新某个实体
	 */
	public T update(T entity) throws Exception;

	/**
	 * 更新或增加一个实体
	 */
	public T saveOrUpdate(T entity) throws Exception;
	
	/**
	 * 删除某个实体
	 */
	public void delete(T entity) throws Exception;

	/**
	 * 根据ID某个实体
	 */
	public T deleteById(Serializable id) throws Exception;

	/**
	 * 删除实体集合
	 */
	public List<T> deleteById(Serializable[] ids) throws Exception;

	public T saveAndRefresh(T entity) throws Exception;
	
	/**
	 * 根据某个某个属性值得到相应实体个数
	 */
	public int countByProperty(String property, Object value);
	
	/**
	 * 根据某个某个属性值的到实体List
	 */
	public List<T> findByProperty(String property, Object value) ;
	
	/**
	 * 根据某个某个属性值的到某个实体
	 */
	public T findUniqueByProperty(String property, Object value) ;
	
	/**
	 * 根据Class、ID得到某个实体
	 */
	public T findById(Class<Object> c, Serializable id);
	
	
	/**
	 * 
	 * removeByOtherId:(通过hql语句删除记录)
	 *
	 * @param  @param hql
	 * @param  @param values
	 * @param  @return 
	 * @return int
	 */
	public int removeByOtherId(String hql, Object... values);
	
	/**
	 * 根据hql得到相应实体个数
	 */
	public int countByHql(String hql);
	
	/**
	 * 根据hql查对象的集合
	 * @param hql
	 * @param offset
	 * @param length
	 * @param values
	 * @return
	 */
	public List<T> findByHql(String hql,int offset,int length,Object...values) ;
	
	/**
	 * 
	 * queryForPage:分页查询
	 * 
	 * @param hql
	 *            查询语句
	 * @param pageSize
	 *            每页大小
	 * @param page
	 *            当前第几页
	 * @return PageBean 封闭了分页信息(包括记录集list)的Bean
	 */
	public PageBean pageQuery(String listHql,String rowsHql, int pageSize, int page);
	
	/**
	 * 
	 * pageQueryBySql:(用SQL语句查询分页)
	 *
	 * @param  @param listSql
	 * @param  @param rowsSql
	 * @param  @param pageSize
	 * @param  @param page
	 * @param  @return 
	 * @return PageBean
	 */
	@SuppressWarnings("unchecked")
	public PageBean pageQueryBySql(String listSql,String rowsSql, int pageSize, int page,Class c) ;
	
	/**
	 * 分页查询，返回pagebean（map）
	 */
	public PageBean pageQueryMapBySql(String listSql,String rowsSql, int pageSize, int page);
	
	/**
	 * 根据sql语句查询集合
	 */
	public List<T> findBySql(String sql, Object... values);
	
	/**
	 * 通过原生sql更新数据库
	 */
	public int executeUpdate(String sql, Object... values) throws Exception;
	
	public List findMapBySql(String sql, Object... values);
    
    public Map<String,Object> findOneMapBySql(String sql, Object... values);
    
    public Map<String,Object> pageQueryBySql(String listSql,String rowsSql, int pageSize, int pageNo, Object[] params) ;
}
